package com.static_;

/**
 * 静态方法可以理解为：
 * 静态方法不需要创建对象就能调用，而普通方法必须创建对象才能调用；
 * 所以在静态方法中不能有普通方法，
 * 静态方法只能访问静态成员变量和方法；，是为了在不创建对象的情况下，直接调用类的方法；
 * 简单理解为：先有爸爸，再有儿子，你都没创建儿子，怎么揍儿子；
 */

public class static入门 {
    /**1.类变量也叫静态变量 / 静态属性
     * 是该类的所有对象共享的变量 任何一个该类的对象区访问它时取到的都是相同的值
     * 同样任何一个该类的对象去修改它时修改的也是同一个变量
     * 即静态变量的值是共享的；
     * 2.定义语法 ： 访问修饰符 static 数据类型 变量名
     * 3.静态变量的访问权限和访问范围都和普通变量一样；
     *
     * 1.静态方法/类方法：类方法不允许访问非静态成员变量和方法，
     * 不允许使用和对象有关的this关键字和super关键字；
     *2.静态方法只能调用静态成员；非静态方法所有的成员方法；
    */
    public static void main(String[] args) {
        A a1 = new A();
        a1.n1++;  //静态变量的值是共享的，静态变量的值加1；
        A a2 = new A();
        a2.n1++;  //静态变量的值是共享的，静态变量的值加1；
        A a3 = new A();
        a3.n1++;  //静态变量的值是共享的，静态变量的值加1；
        System.out.println("a1.n1 = " + a1.n1+ " a2.n1 = " + a2.n1+ " a3.n1 = " + a3.n1);//4，4，4
        //因为n1是静态变量，所以n1是共享的，所以加加后  ，n1的值是3



        A.n1 = 100;  //将n1的值改为100
        System.out.println("a1.n1 = " + a1.n1+ " a2.n1 = " + a2.n1+ " a3.n1 = " + a3.n1);//100，100，100
        //因为n1是静态变量，所以n1是共享的，所以 A.n1 = 100后  ，n1的值是100，所以a1.n1 = 100 a2.n1 = 100 a3.n1 = 100


    }
}

class A {
    //static修饰的静态成员变量，叫类变量，也叫静态变量，其静态变量可以在同一个类中和其创建的对象中共享；
    public static int n1 = 1;
    int n2;


    //n1 是所有对象共享的，
    // 可以用类名.变量名访问 A.n1
    // 也可以用对象名.变量名访问 a1.n1
}

class B {
    //静态方法中，只能访问静态成员变量，不能访问非静态成员变量；
        public static String name;
        public  String job;
        public void bb() {}
    public static void b1() {  //静态方法中，只能访问静态成员变量，不能访问非静态成员变量；
        System.out.println(name);
    }
//    public static void b2() {  //静态方法中，只能访问静态成员变量，不能访问非静态成员变量；
//        System.out.println(job);  报错
//    }

//    public static void b3() {  //静态方法中，不能使用this关键字或者super关键字；
//        System.out.println(this.name); 报错
//    }

    public static void b4() {
        System.out.println(name);
        b1(); //静态方法中，只能访问静态方法，不能访问非静态方法；
//        bb();  报错
    }

}